package com.justgame.mq.client.service;

import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.concurrent.CompletableFuture;


/**
 * RabbitMQ发送者service
 */
public interface RabbitMqSendService {

    /**
     * RabbitMQ发送消息(使用默认的交换机)
     *
     * @param routingKey : 路由键
     * @param message :    消息内容（Json格式）
     * @return Boolean 发送结果
     */
    void sendMsg(String routingKey, Object message);

    /**
     * 重新再次发送RabbitMQ消息(使用默认的交换机)
     * @param routingKey: 路由键
     * @param message:    消息内容（Json格式）
     * @return Boolean 发送结果
     */
    void resendMsg(String routingKey, Object message, CorrelationData correlationData);
    /**
     * RabbitMQ发送消息(指定交换机)
     *
     * @param exchange:   交换机
     * @param routingKey: 路由键
     * @param message:    消息内容
     */
    void sendMsg(String exchange, String routingKey, String message);

    /**
     * 功能描述:
     * 〈RabbitMQ发送延迟消息〉
     *
     * @param exchange:   交换机
     * @param routingKey: 路由键
     * @param message     消息内容
     * @param delay       延迟时间
     */
    void sendMsg(String exchange, String routingKey, String message, Long delay);

    /**
     * 创建交换机
     *
     * @param exchangeName 交换机名称
     * @param durable      是否长期有效
     */

    void addExchange(@RequestParam("exchangeName") String exchangeName,
                     @RequestParam("durable") Boolean durable);

    /**
     * 创建队列
     *
     * @param queueName 队列名称
     * @param durable   声明一个持久队列
     * @param exclusive 声明一个独立队列
     */

    void addQueue(String queueName,
                  Boolean durable,
                  Boolean exclusive);

    /**
     * 消息队列、交换机、路由绑定
     *
     * @param exchangeName 交换机名称
     * @param routingKey:  路由键
     * @param queueName    队列名称
     * @param durable      声明一个持久队列/是否长期有效
     */
    void declareTopicRoutingQueue(String exchangeName,
                                  String routingKey,
                                  String queueName,
                                  Boolean durable);

    /**
     * 根据队列名称查询队列的数量
     *
     * @param queueName 队列名称
     */

    Integer findMessageCount(String queueName);

    /**
     * 删除消息队列
     *
     * @param queueName 队列名称
     */

    void deleteQuery(String queueName);

    /**
     * 删除交换机
     *
     * @param exchangeName 交换机名称
     */

    void deleteExchangeName(String exchangeName);
}
